/**
 * 数据库连接配置文件
 * 功能：初始化 Sequelize ORM 框架的数据库连接实例，
 *      并提供连接测试功能，最终导出实例供其他模块（如数据模型）使用
 */

// 导入依赖模块
// Sequelize：Node.js 下的 ORM 工具，用于以对象化方式操作数据库（无需直接编写 SQL）
const { Sequelize } = require("sequelize");
// dotenv：从项目根目录的 .env 文件中加载环境变量到 process.env，
//        避免数据库账号、密码等敏感信息硬编码在代码中
require("dotenv").config();

/**
 * 创建 Sequelize 实例（即数据库连接对象）
 * 参数说明：
 * - 第一个参数：数据库名称（从环境变量读取，对应 .env 中的 DB_NAME）
 * - 第二个参数：数据库用户名（从环境变量读取，对应 .env 中的 DB_USER）
 * - 第三个参数：数据库密码（从环境变量读取，对应 .env 中的 DB_PASSWORD）
 * - 第四个参数：配置对象，包含连接细节
 */
const sequelize = new Sequelize(
  process.env.DB_NAME, // 数据库名称（必填，若未配置会连接失败）
  process.env.DB_USER, // 数据库登录用户名（必填）
  process.env.DB_PASSWORD, // 数据库登录密码（若数据库无密码可传空字符串）
  {
    host: process.env.DB_HOST || "localhost", // 数据库地址，默认本地（localhost）
    port: process.env.DB_PORT || 3306, // 数据库端口，MySQL 默认 3306（添加默认值避免未配置时出错）
    dialect: "mysql", // 数据库类型（必须指定，这里是 MySQL，其他可选如 postgres、sqlite 等）
    // 日志配置：开发环境打印执行的 SQL 语句（方便调试），生产环境关闭（节省性能）
    logging: process.env.NODE_ENV === "development" ? console.log : false,
    // 连接池配置：管理数据库连接的复用，避免频繁创建/关闭连接（提升性能）
    pool: {
      max: 10, // 连接池最大连接数（同时可建立的最大连接，根据服务器性能调整）
      min: 0, // 连接池最小保留连接数（空闲时至少保留的连接）
      acquire: 30000, // 获取连接的最长等待时间（毫秒），超时则抛出错误
      idle: 10000, // 连接空闲超时时间（毫秒），超过则关闭该连接
    },
    timezone: "+08:00", // 设置数据库时区为北京时间（东八区），避免时间存储/读取时的时区偏差
  }
);

/**
 * 测试数据库连接是否成功的异步函数
 * 作用：在应用启动时验证数据库配置是否正确，连接是否可达
 */
const testDbConnection = async () => {
  try {
    // 调用 Sequelize 实例的 authenticate 方法尝试建立连接
    await sequelize.authenticate();
    console.log("数据库连接已成功建立"); // 连接成功时打印提示
  } catch (error) {
    // 连接失败时捕获错误并打印详细信息（包含错误原因，方便排查）
    console.error("无法连接到数据库:", error);
    // 连接失败时退出进程（避免服务在数据库不可用的情况下继续运行）
    process.exit(1);
  }
};

// 执行连接测试（可根据环境变量控制是否执行，如生产环境可不测试）
if (process.env.NODE_ENV !== "production") {
  testDbConnection();
}

// 导出 Sequelize 实例，供其他模块（如数据模型定义）使用
// 其他文件通过 require("../config/db") 导入后，可基于该实例定义模型、执行查询等
module.exports = sequelize;
